package com.tedu.day02.oop;

/**
 * 抽象类:  抽象类与抽象方法   关键字: abstract
 * 类: 只能提供行为概念，没有具体实现行为
 *
 * 抽象类与面向对象---多态绝对关系【向上造型创建抽象对象】
 * 使用多态创建抽象类对象，抽象类本身无法创建抽象对象，需要使用多态完成抽象类创建
 *
 * 什么是使用抽象类?实现不同的功能，首先抽象类【Android常用】
 * 复杂项目时，需要在不同类下
 *
 * 定义抽象类与抽象方法?
 * 抽象类: 修饰符  abstract class 类名{}  ----毫无意义，必须结合抽象方法
 * 抽象方法: 修饰符 abstract 返回值   方法(参数)；  --没有具体的实现
 *
 * 抽象类"实例化: 创建对象“  :抽象类自身无法实例化
 * ①创建【N】个子类，继承抽象【父】类，子类一定实现抽象【父】类对的所有抽象方法
 * ②使用面向对象: 多态【向上造型】   抽象类 引用=new 【实现】 子类();
 *
 * 注意: 抽象类一定发生重写，子类继承抽象【父】类，也可以叫作"实现类"!
 */
abstract class Animals{   //抽象类
    //抽象方法:没有具体的实现【代码块】---- 一定继承 ---- 一定多态性【造型】
    public abstract void say();
    //①定义由final修饰的抽象方法  ?    ×
    //public final abstract void sleep();
    //②定义抽象变量  ?              ×
    //abstract int i=1;
    //③定义静态变量  ?             √
    static int i=1;
    //④定义静态抽象变量  ?          ×
    //static abstract int j=1;
    //⑤定义静态的抽象方法【无实现】   ×
    //public static abstract void eat();
    //⑥定义静态的方法【无实现: 空代码块 】 √
    public static void eat(){};
         //⑤⑥总结: 抽象方法/静态方法，方法定义:修饰符  static|abstract  返回值  方法名
    //⑦可以定义内部类: 静态内部类     √
        static class Sos{}
    //⑧抽象类有构造器吗  ?          √
    public Animals() {
    }
    //⑨抽象类当中可以有普通实现方法吗  ?   √
    public void run(){}
}
    //⑩抽象类可以继承抽象类吗  ?   √  实现: 两个抽象类---形容一个实现
    abstract class Thing extends Animals{
    public abstract void sleep();
    }
    //目的: 两个抽象类中所有抽象方法----继承【子】抽象类

//实现类: 实现抽象【父】类的方法----多个实现类----继承----抽象
class Person1 extends Animals{  //报错原因: 完成重写
    public void say() {
        System.out.println("人---说话~");
    }

}
public class 抽象类 {
    public static void main(String[] args) {
        //抽象类无法创建对象: 提供抽象方法---必须由子类实现---多态【造型】
        Animals a=new Person1() ;
        a.say();  //向上造型---重写抽象父类的抽象方法【覆盖】

    }
}
